package controller.states;

import controller.ControllerInformation;
import event.numberevent.NumberEvent;
import event.numberevent.NumberListener;
import event.numberevent.Range;

/**rappresenta un oggetto che si interessa sullo stato del wizard di inserimento
 * di un oggetto nella mappa.  Lo stato di tale wizard e' dettato su cosa sta facendo
 * in un determinato momento l'utente. I momento sono vari:
 * 
 * <ol>
 *  <li>{@link #START}: l'utente sta decidendo che classe inserire nell'oggetto</li>
 *  <li>{@link #ONLYRENDERER}: l'utente ha deciso il Renderer da inserire nella mappa, sia esso di tipo Background o Foreground</li>
 *  <li>{@link #ONLYCONCEPT}: l'utente ha deciso il Concept da inserire nella mappa, sia esso di tipo Background o Foreground</li>
 *  <li>{@link #MAPELEMENTCHOOSEN}: l'utente ha deciso che classe inserire nella mappa (cioé ha scelto sia il renderer che il concept): 
 *  in questo l'utente puo' incominciare ad inserire fisicamente l'oggetto nella mappa</li>
 *  <li>{@link #CLASSADDED}: l'utente ha inserito l'oggetto nella mappa</li>
 * </ol>
 * 
 * non importa se l'utente inserisce prima il renderer o il concept; una volta che li ha scelti entrambi può incominciare
 * fisicamente ad inserire un oggetto nella mappa.
 * <p>Ereditare questa classe significa ereditare anche un StateNumber in cui può essere ascoltato lo stato
 * 
 * @author Koldar
 * @version 1.2
 */
public interface UserObjectToAddListener extends NumberListener<Integer>,MapElementToAddStateUser{

	
	/**indica la lista di istruzioni da eseguire quando l'utente
	 * ha appena iniziato la procedura di inserzione e non sa ancora che renderer/concept
	 * utilizzare
	 * 
	 * @param arg0
	 */
	@Range(inf = START, sup = START)
	public void startInsertion(NumberEvent<Integer> arg0);
	
	/**indica la lista di istruzioni da eseguire quando l'utente
	 * ha scelto il Renderer e il concept da inserire nella mappa
	 * 
	 * @param arg0
	 */
	@Range(inf = MAPELEMENTCHOOSEN, sup = MAPELEMENTCHOOSEN)
	public void mapElementChoosen(NumberEvent<Integer> arg0);
	
	/**indica la lista di istruzioni da eseguire quando l'utente ha
	 * scelto il Renderer e il concept da inserire nella mappa, ma risceglie
	 * uno dei 2 aggiornando così il MapElement da inserire nella mappa
	 * 
	 * @param arg0
	 */
	@Range(inf = MAPELEMENTUPDATED, sup = MAPELEMENTUPDATED)
	public void mapElementUpdated(NumberEvent<Integer> arg0);

	/**indica la lista di istruzioni da eseguire quando l'utente ha scelto
	 * il Renderer da utilizzare
	 * 
	 * @param arg0
	 */
	@Range(inf = ONLYRENDERER, sup = ONLYRENDERER)
	public void rendererChoosen(NumberEvent<Integer> arg0);
	
	/**indica la lista di istruzioni da eseguire quando l'utente ha scelto
	 * il Concept da usare
	 * 
	 * @param arg0
	 */
	@Range(inf = ONLYCONCEPT, sup = ONLYCONCEPT)
	public void conceptChoosen(NumberEvent<Integer> arg0);

}
